package main

import (
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

type User struct {
	ID       uint `gorm:"primarykey;AUTO_INCREMENT"`
	Name     string
	Password string
}

func main() {
	// mysql db 连接, mysql user name: etcix
	// password: 123456
	// 配置你自己的参数
	dsn := "etcix:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		log.Fatal(err)
	}

	db.AutoMigrate(&User{})

	// 后端api服务器
	server := gin.Default()

	// 注册
	server.POST("/api/user/register", func(ctx *gin.Context) {
		u := User{}
		ctx.BindJSON(&u)
		// 查询用户名
		res := db.Where("name=?", u.Name).First(&User{})
		if res.RowsAffected != 0 {
			ctx.JSON(http.StatusOK, gin.H{
				"msg": "注册失败, 用户名已存在",
			})
		} else {
			db.Create(&u)
			ctx.JSON(http.StatusOK, gin.H{
				"msg": "注册成功",
			})
		}
	})

	// 登录
	server.POST("/api/user/login", func(ctx *gin.Context) {
		u := User{}
		ctx.BindJSON(&u)
		res := db.Where("name = ? AND password = ?", u.Name, u.Password).First(&User{})

		if res.RowsAffected != 0 {
			ctx.JSON(http.StatusOK, gin.H{
				"msg": "登录成功",
			})
		} else {
			ctx.JSON(http.StatusInternalServerError, gin.H{
				"msg": "登录失败, 用户名或密码不正确",
			})
		}
	})

	// 查询所有用户
	server.GET("/api/users", func(ctx *gin.Context) {
		var users []User
		result := db.Find(&users) // 查询所有用户
		if result.Error != nil {
			ctx.JSON(http.StatusInternalServerError, gin.H{
				"msg": "查询失败",
			})
			return
		}
		ctx.JSON(http.StatusOK, gin.H{
			"msg":   "查询成功",
			"users": users,
		})
	})
	server.Run(":6969")
}
